/**
 * description：用户信息
 * author：洪俊勇
 * createTime：2017/9/8
 * version:1.0.0.0
 * history:
 *   1、
 *   2、
 */
var mongoose = require('mongoose');
var bcrypt = require('bcrypt-nodejs');//为密码提供的一个加密算法 npm install bcrypt-nodejs --save-dev
var SALT_WORK_FACTOR = 10;

var UserSchema = new mongoose.Schema({
    name: {
        unique: true,
        type: String
    },
    password: String,
    role:{
        type:Number,
        default:0
    },
    meta: {
        createAt: {
            type: Date,
            default: Date.now()
        },
        updateAt: {
            type: Date,
            default: Date.now()
        }
    }
});

/**
 * 每次存储的时候都来调用这个方法
 */
UserSchema.pre('save', function (next) {
    var user = this;

    if (this.isNew) {//判断数据是否新加的
        this.meta.createAt = this.meta.updateAt = Date.now();
    } else {
        this.meta.updateAt = Date.now();
    }

    /**
     * 加盐
     */
    bcrypt.genSalt(SALT_WORK_FACTOR,function (err,salt) {
        if(err) return next(err);

        /**
         * 注意：这里新的加盐，要传入4个参数
         */
        bcrypt.hash(user.password,salt,null,function (err,hash) {
            if(err) return next(err);

            user.password = hash;
            // 让存储流程继续走下去
            next();
        })
    })
});

UserSchema.methods = {
    /**
     * 判断用户的登录密码是否正确
     * this.password 当前数据库的密码
     * @param _password 用户输入的密码
     * @param cb 回调
     */
    comparePassword:function (_password,cb) {
        var _this = this;
        bcrypt.compare(_password,_this.password,function (err,isMatch) {
            if(err) return cb(err);
            cb(null,isMatch);
        })
    }
};

UserSchema.statics = {
    /**
     * 取出数据库中所有数据
     * @param cb
     * @returns {Promise|Array|{index: number, input: string}|*|{npmUpdate}}
     */
    fetch: function (cb) {
        return this
            .find({})
            .sort('meta.updateAt')
            .exec(cb)
    },
    /**
     * 根据id查询
     * @param id
     * @param cb
     * @returns {Promise}
     */
    findById: function (id, cb) {
        return this
            .findOne({_id: id})
            .exec(cb)
    }
};

//把模式导出
module.exports = UserSchema;
